Õppige, kuidas Django REST Framework API-sid ViewSetide abil tõhusalt korraldada. See juhend hõlmab kõike alates põhilistest kasutusviisidest kuni täpsema kohandamiseni, pakkudes praktilisi näiteid ja parimaid praktikaid.
Django REST Framework ViewSetid: API lõpp-punktide organiseerimise valdamine
Kaasaegses veebiarenduses on tugevate ja hästi struktureeritud API-de loomine ülioluline. Django REST Framework (DRF) on võimas tööriistakomplekt RESTful API-de loomiseks Djangoga. Kuigi DRF pakub mitmesuguseid tööriistu API lõpp-punktide loomiseks, pakuvad ViewSetid elegantse viisi seotud vaadete korraldamiseks ühte klassi, mis viib puhtama ja paremini hooldatava koodini. See põhjalik juhend uurib ViewSete üksikasjalikult, hõlmates nende eeliseid, kasutusviise ja täpsemaid kohandamistehnikaid.
Mis on ViewSetid?
ViewSet on klassipõhine vaade, mis pakub standardtoimingute, näiteks list
, create
, retrieve
, update
ja destroy
rakendusi. Selle asemel, et määratleda iga toimingu jaoks eraldi vaateid, ühendab ViewSet need ühte klassi, lihtsustades API struktuuri ja vähendades koodi dubleerimist. ViewSetid on eriti kasulikud mudelipõhiste API-dega töötamisel, kus neid standardtoiminguid tavaliselt nõutakse. Mõelge ViewSetile kui konkreetse ressursi toimingute loogilisele rühmitusele.
ViewSetide kasutamise eelised
- Koodi taaskasutatavus: ViewSetid soodustavad koodi taaskasutust, kapseldades ühise API loogika ühte klassi. See vähendab liigsust ja muudab koodi lihtsamini hooldatavaks.
- Lihtsustatud marsruutimine: ViewSetid lihtsustavad marsruutimist, rĂĽhmitades seotud vaated ĂĽhe URL-i eesliite alla. Selle tulemuseks on puhtam ja organiseeritum URL-i struktuur.
- Vähendatud boilerplate: ViewSetid vähendavad boilerplate koodi, pakkudes vaikerakendusi tavaliste API toimingute jaoks. See võimaldab arendajatel keskenduda oma rakendusele spetsiifilise kohandatud loogika rakendamisele.
- Parem loetavus: ViewSetid parandavad koodi loetavust, korraldades seotud vaated ühte klassi. See muudab API struktuuri lihtsamini mõistetavaks ja navigeeritavaks.
- Järjepidevus: ViewSetid aitavad tagada API järjepidevuse, jõustades standardse toimingute ja konventsioonide komplekti. See muudab API ennustatavamaks ja lihtsamini kasutatavaks.
ViewSetide põhiline kasutus
Alustame lihtsa näitega ViewSetide kasutamisest toodete haldamiseks API loomiseks. Esmalt määratlege mudel:
# models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
price = models.DecimalField(max_digits=10, decimal_places=2)
def __str__(self):
return self.name
Järgmisena määratlege Product
mudeli jaoks serialiseerija:
# serializers.py
from rest_framework import serializers
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
NĂĽĂĽd looge Product
mudeli jaoks ViewSet:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
Lõpuks konfigureerige URL-i marsruutimine:
# urls.py
from django.urls import path, include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'products', views.ProductViewSet)
urlpatterns = [
path('', include(router.urls)),
]
See konfiguratsioon genereerib automaatselt järgmised API lõpp-punktid:
/products/
(GET: list, POST: create)/products/{id}/
(GET: retrieve, PUT: update, PATCH: partial_update, DELETE: destroy)
ModelViewSet
pakub vaikerakendusi kõigi standardsete CRUD toimingute jaoks. Atribuut queryset
määrab objektide komplekti, millega ViewSet peaks töötama, ja atribuut serializer_class
määrab serialiseerija, mida kasutada andmete serialiseerimiseks ja deserealiseerimiseks.
ViewSetide tĂĽĂĽbid
DRF pakub mitmeid sisseehitatud ViewSeti klasse, mis on mõeldud erinevate kasutusjuhtude jaoks:
ViewSet
: Kõigi ViewSetide alusklass. See pakub põhitaristut päringute ja vastuste käsitlemiseks.ReadOnlyModelViewSet
: ViewSet, mis pakub ainult lugemise toiminguid (list
jaretrieve
). See on kasulik API-de jaoks, mis võimaldavad ainult andmete hankimist.ModelViewSet
: ViewSet, mis pakub kõiki standardseid CRUD toiminguid (list
,create
,retrieve
,update
jadestroy
). See on kõige sagedamini kasutatav ViewSet mudelipõhiste API-de jaoks.GenericViewSet
: ViewSet, mis pakub ĂĽhiste API toimingute jaoks ĂĽldist rakendust. Seda saab kasutada kohandatud ViewSetide loomiseks alusklassis.
Õige ViewSeti valimine sõltub teie API spetsiifilistest nõuetest. Kui vajate ainult lugemise toiminguid, kasutage ReadOnlyModelViewSet
. Kui vajate kõiki standardseid CRUD toiminguid, kasutage ModelViewSet
. Kui vajate rohkem kontrolli API käitumise üle, saate luua kohandatud ViewSeti, pärides GenericViewSet
või ViewSet
.
ViewSetide kohandamine
Kuigi sisseehitatud ViewSetid pakuvad mugava viisi API-de loomiseks, võib teil olla vaja kohandada nende käitumist, et see vastaks konkreetsetele nõuetele. DRF pakub mitmeid viise ViewSetide kohandamiseks, sealhulgas meetodite ülekirjutamine, kohandatud toimingute lisamine ja kohandatud serialiseerijate kasutamine.
Meetodite ĂĽlekirjutamine
Saate standardsete API toimingute vaikerakendused üle kirjutada, määratledes oma ViewSeti klassis sama nimega meetodeid. Näiteks saate uue objekti loomise eel või järel kohandatud loogika lisamiseks üle kirjutada meetodi create
:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework.response import Response
from rest_framework import status
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
# Lisage siia kohandatud loogika enne objekti loomist
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
Selles näites kirjutab meetod create
vaikerakenduse ĂĽle ja lisab enne objekti loomist kohandatud loogika. Meetodit perform_create
kutsutakse objekti tegelikuks loomiseks ja vastus tagastatakse olekukoodiga 201 Created
.
Kohandatud toimingute lisamine
Saate oma ViewSetile lisada kohandatud toiminguid, kasutades dekoraatorit @action
. Kohandatud toimingud võimaldavad teil määratleda uusi API lõpp-punkte, mis teostavad ViewSeti hallatavatel ressurssidel spetsiifilisi toiminguid. Näiteks saate lisada toimingu toote esiletõstetuks märkimiseks:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
@action(detail=True, methods=['post'])
def feature(self, request, pk=None):
product = self.get_object()
product.is_featured = True
product.save()
serializer = self.get_serializer(product)
return Response(serializer.data)
Selles näites määratleb dekoraator @action
uue API lõpp-punkti /products/{id}/feature/
, mis märgib toote esiletõstetuks. Argument detail=True
näitab, et toiming toimub mudeli konkreetsel eksemplaril. Argument methods=['post']
määrab, et toiming aktsepteerib ainult POST päringuid.
Kohandatud serialiseerijate kasutamine
Saate kasutada kohandatud serialiseerijaid, et kohandada viisi, kuidas ViewSet andmeid serialiseerib ja deserealiseerib. See on kasulik, kui peate käsitlema keerulisi andmestruktuure või teostama kohandatud valideerimist. Näiteks saate kasutada kohandatud serialiseerijat, et lisada API vastusesse seotud andmeid:
# serializers.py
from rest_framework import serializers
from .models import Product, Category
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['id', 'name']
class ProductSerializer(serializers.ModelSerializer):
category = CategorySerializer(read_only=True)
class Meta:
model = Product
fields = '__all__'
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
Selles näites sisaldab ProductSerializer
seotud kategooria andmete serialiseerimiseks CategorySerializer
. See võimaldab teil hankida kategooria teabe koos tooteteabega ühe API päringuga.
Täpsemad ViewSeti tehnikad
Lisaks põhilisele kasutamisele ja kohandamisele pakuvad ViewSetid täpsemaid tehnikaid keerukate API-de loomiseks:
Filtreerimine
DRF pakub võimsaid filtreerimisvõimalusi, mis võimaldavad teil päringu komplekti filtreerida päringuparameetrite alusel. Saate kasutada atribuuti filter_backends
, et määrata kasutatavad filtreerimisbackendid. Näiteks saate kasutada SearchFilter
, et võimaldada kasutajatel otsida tooteid nime või kirjelduse järgi:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework import filters
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = [filters.SearchFilter]
search_fields = ['name', 'description']
Selles näites määrab atribuut filter_backends
, et tuleks kasutada SearchFilter
. Atribuut search_fields
määrab väljad, mida tuleks otsida.
LehekĂĽlgede kaupa jaotamine
DRF pakub lehekülgede kaupa jaotamise võimalusi, mis võimaldavad teil jagada päringu komplekti väiksemateks lehtedeks. See on kasulik suurte andmekogumitega tegelemisel. Saate kasutada atribuuti pagination_class
, et määrata kasutatav lehekülgede kaupa jaotamise klass. Näiteks saate kasutada PageNumberPagination
tulemuste lehekĂĽlgede kaupa jaotamiseks lehekĂĽljenumbrite abil:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework.pagination import PageNumberPagination
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
pagination_class = PageNumberPagination
Selles näites määrab atribuut pagination_class
, et tuleks kasutada PageNumberPagination
. Samuti saate kohandada lehekülgede kaupa jaotamise käitumist, luues oma lehekülgede kaupa jaotamise klassi.
Autentimine ja õigused
DRF pakub paindlikke autentimis- ja õigusmehhanisme, mis võimaldavad teil kontrollida juurdepääsu oma API lõpp-punktidele. Saate kasutada atribuute authentication_classes
ja permission_classes
, et määrata kasutatavad autentimis- ja õigusklassid. Näiteks saate kasutada TokenAuthentication
kasutajate autentimiseks tokenite abil ja õigust IsAuthenticated
, et lubada API-le juurdepääsu ainult autentitud kasutajatel:
# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
Selles näites määrab atribuut authentication_classes
, et tuleks kasutada TokenAuthentication
, ja atribuut permission_classes
määrab, et tuleks kasutada õigust IsAuthenticated
.
Parimad tavad ViewSetide kasutamisel
Veendumaks, et teie ViewSetid on hästi kujundatud ja hooldatavad, järgige neid parimaid tavasid:
- Hoidke ViewSetid fokusseeritud: Iga ViewSet peaks vastutama ühe ressursi või tihedalt seotud ressursside komplekti haldamise eest. Vältige liiga keerukate ViewSetide loomist, mis käsitlevad mitut mitteseotud toimingut.
- Kasutage sobivaid ViewSeti tüüpe: Valige ViewSeti tüüp, mis sobib kõige paremini teie API nõuetega. Kasutage
ReadOnlyModelViewSet
ainult lugemise API-de jaoks,ModelViewSet
CRUD API-de jaoks jaGenericViewSet
võiViewSet
kohandatud API-de jaoks. - Järgige RESTful põhimõtteid: Kujundage oma API lõpp-punktid vastavalt RESTful põhimõtetele. Kasutage ressurssidel toimingute tegemiseks standardseid HTTP meetodeid (GET, POST, PUT, PATCH, DELETE).
- Kasutage andmete valideerimiseks serialiseerijaid: Kasutage serialiseerijaid andmete valideerimiseks, mis saadetakse API-le ja sealt vastu võetakse. See aitab tagada andmete terviklikkuse ja vältida vigu.
- Rakendage nõuetekohane autentimine ja õigused: Kaitske oma API lõpp-punkte, rakendades nõuetekohase autentimise ja õigused. See aitab kaitsta teie andmeid volitamata juurdepääsu eest.
- Kirjutage põhjalikud testid: Kirjutage põhjalikud testid, et tagada teie ViewSetide korrektne toimimine. See aitab vältida regressioone ja muudab koodi lihtsamini hooldatavaks.
Rahvusvahelistamise (i18n) ja lokaliseerimise (l10n) kaalutlused
Globaalsele publikule API-de loomisel on oluline arvestada rahvusvahelistamise (i18n) ja lokaliseerimisega (l10n). ViewSete saab kohandada mitme keele ja piirkonna toetamiseks:
- Serialiseerija väljad: Kasutage DRF serialiseerija välju koos sobivate tõlkefunktsioonidega (nt Django i18n raamistikust
gettext
), et kuvada tõlgitud väljasildid ja abitekstid. - Veateated: Veenduge, et API tagastatud veateated on tõlgitud kasutaja eelistatud keelde.
- Kuupäeva ja kellaaja vorming: Kasutage sobivat kuupäeva ja kellaaja vormingut, mis põhineb kasutaja lokaadil. DRF pakub võimalusi kuupäeva ja kellaaja vormingute kohandamiseks.
- Valuuta vorming: Vormindage valuuta väärtusi vastavalt kasutaja lokaadile. Kaaluge valuuta vormindamiseks selliste teekide nagu
babel
kasutamist. Näiteks võib hind 1234,56 USD olla USA-s vormindatud kui $1,234.56, kuid mõnes Euroopa riigis kui 1.234,56 $ . - Ajavööndid: Käsitlege ajavööndeid õigesti. Salvestage kuupäevad ja kellaajad UTC-s ning teisendage need kuvamisel kasutaja kohalikku ajavööndisse.
Näiteks võib tootel olla kirjeldus, mis tuleb tõlkida. Kasutaksite Djangos tõlkesüsteemi serialiseerijas:
# serializers.py
from rest_framework import serializers
from django.utils.translation import gettext_lazy as _
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
description = serializers.CharField(help_text=_("Toote kirjeldus"))
class Meta:
model = Product
fields = '__all__'
Ja oma mallides või koodis, mis seda serialiseerijat kasutab, veenduge, et õige keel on aktiveeritud.
Näide: e-kaubanduse API rahvusvahelise toega
Kujutage ette e-kaubanduse API-t, mis mĂĽĂĽb tooteid kogu maailmas. Mudel Product
võib sisaldada välju nagu name
, description
, price
ja image
. API peab toetama mitut keelt ja valuutat.
ViewSet haldaks toodete põhitoiminguid CRUD. Serialiseerijaid kohandataks toote nime ja kirjelduse tõlke toetamiseks. API sisaldaks ka lõpp-punkte toodete hankimiseks kategooria järgi, toodete filtreerimiseks hinnavahemiku järgi ja toodete otsimiseks märksõna järgi. Need funktsioonid peaksid arvestama rahvusvahelistumist, eriti seoses otsinguterminite ja tootekirjeldustega, mis võivad keelte lõikes erineda.
URL-i näited:
/en/products/
- Toodete loend inglise keeles/fr/products/
- Toodete loend prantsuse keeles/en/products/?currency=USD
- Toodete loend USD-s/fr/products/123/?currency=EUR
- Toote 123 ĂĽksikasjad prantsuse keeles, hind kuvatakse EUR-s
Järeldus
Django REST Framework ViewSetid pakuvad võimsa ja elegantse viisi oma API lõpp-punktide korraldamiseks. Seotud vaadete kapseldamisega ühte klassi edendavad ViewSetid koodi taaskasutust, lihtsustavad marsruutimist ja parandavad koodi loetavust. Võimalusega kohandada ViewSete meetodite ülekirjutamise, kohandatud toimingute lisamise ja kohandatud serialiseerijate abil saate need kohandada vastavalt oma API spetsiifilistele nõuetele. Järgides selles juhendis toodud parimaid tavasid, saate tagada, et teie ViewSetid on hästi kujundatud, hooldatavad ja skaleeritavad, mille tulemuseks on tugevad ja tõhusad API-d.
Ärge unustage rahvusvahelistumist ja lokaliseerimist, kui loote API-sid ülemaailmsele publikule. Kohandage oma ViewSete ja serialiseerijaid mitme keele, valuuta ja ajavööndi toetamiseks, et pakkuda kasutajatele sujuvat kogemust kogu maailmas.
ViewSetide valdamisega saate viia oma Django REST Frameworki oskused järgmisele tasemele ja luua API-sid, mis on nii võimsad kui ka hooldatavad. See aitab kaasa kvaliteetsele tarkvarale ja positiivsele kasutajakogemusele teie ülemaailmsele publikule.
See juhend peaks olema kindel alus ViewSetide mõistmiseks ja rakendamiseks oma Django REST Frameworki projektides. Harjutage, katsetage ja uurige DRF dokumentatsiooni, et saada tõeliseks ViewSeti meistriks!